"""
optipng MCP Server

面向 optipng 图像压缩软件的 MCP 服务器，提供命令行操作的封装。

MCP tools 列表：
1. optipng_compress - 压缩 PNG 图像文件
   参数：input_file (str) - 输入 PNG 文件路径
   返回：包含命令执行结果的 JSON 结构

2. optipng_version - 获取 optipng 版本信息
   参数：无
   返回：包含命令执行结果的 JSON 结构

3. optipng_help - 显示 optipng 帮助信息
   参数：无
   返回：包含命令执行结果的 JSON 结构
"""

from mcp.server.fastmcp import FastMCP, Context
import subprocess
import json

# 创建 MCP 服务器实例
mcp = FastMCP("optipng MCP Server")

@mcp.tool()
def optipng_compress(input_file: str) -> dict:
    """
    使用 optipng 压缩 PNG 图像文件
    
    参数:
        input_file (str): 要压缩的 PNG 文件路径
        
    返回:
        dict: 统一格式的 JSON 结构，包含:
            - success (bool): 命令是否成功执行
            - command (str): 执行的完整命令
            - exit_code (int): 命令退出码
            - stdout (str): 标准输出内容
            - stderr (str): 标准错误内容
    """
    command = ["optipng", input_file]
    
    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True,
            timeout=30
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out after 30 seconds"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Error executing command: {str(e)}"
        }

@mcp.tool()
def optipng_version() -> dict:
    """
    获取 optipng 版本信息
    
    参数:
        无
        
    返回:
        dict: 统一格式的 JSON 结构，包含:
            - success (bool): 命令是否成功执行
            - command (str): 执行的完整命令
            - exit_code (int): 命令退出码
            - stdout (str): 标准输出内容
            - stderr (str): 标准错误内容
    """
    command = ["optipng", "--version"]
    
    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True,
            timeout=10
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out after 10 seconds"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Error executing command: {str(e)}"
        }

@mcp.tool()
def optipng_help() -> dict:
    """
    显示 optipng 帮助信息
    
    参数:
        无
        
    返回:
        dict: 统一格式的 JSON 结构，包含:
            - success (bool): 命令是否成功执行
            - command (str): 执行的完整命令
            - exit_code (int): 命令退出码
            - stdout (str): 标准输出内容
            - stderr (str): 标准错误内容
    """
    command = ["optipng", "--help"]
    
    try:
        result = subprocess.run(
            command,
            capture_output=True,
            text=True,
            timeout=10
        )
        
        return {
            "success": result.returncode == 0,
            "command": " ".join(command),
            "exit_code": result.returncode,
            "stdout": result.stdout,
            "stderr": result.stderr
        }
    except subprocess.TimeoutExpired:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": "Command timed out after 10 seconds"
        }
    except Exception as e:
        return {
            "success": False,
            "command": " ".join(command),
            "exit_code": -1,
            "stdout": "",
            "stderr": f"Error executing command: {str(e)}"
        }

if __name__ == "__main__":
    mcp.run()